#include "MOTORS.h"                  // Device header

/**
  * 函    数：电机初始化
  * 参    数：无
  * 返 回 值：无
  */
void Motor_Init(void)
{
	/*定义变量*/
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
	TIM_OCInitTypeDef TIM_OCInitStructure; 
	
	/*开启时钟*/ 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);			//开启TIM4的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);			//开启GPIOB的时钟
	
	/*GPIO初始化*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //設置輸出速率
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //将引脚初始化为推挽输出
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //設置輸出速率
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;   //将引脚初始化为复用推挽输出
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	/*设定轮子初始状态为静止*/
	GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET); //Bit_RESET: 低电平 Bit_SET: 高电平 
	GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);
	GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET);
	GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET);
	
	/*定时器时基单元初始化*/
	TIM_TimeBaseStructure.TIM_Period = 1000-1;      //计数周期，即ARR的值,自动装载计数器周期值
	TIM_TimeBaseStructure.TIM_Prescaler = 72-1;     //预分频器，即PSC的值
	TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;  //时钟分频，选择不分频，此参数用于配置滤波器时钟，不影响时基单元功能
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数器模式，选择向上计数
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;             //重复计数器，高级定时器才会用到
	TIM_TimeBaseInit(TIM4, & TIM_TimeBaseStructure); 

	/* 输出比较初始化 */ 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             //输出比较模式，选择PWM模式1. 向上计数：CNT<CCR时，REF置有效电平，CNT≥CCR时，REF置无效电平
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; 	                          //初始的比较寄存器CCR值, PWM占空比：Duty = CCR / (ARR + 1)
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //高电平有效,输出极性，选择为高，若选择极性为低，则输出高低电平取反
	TIM_OC3Init(TIM4, & TIM_OCInitStructure); //将结构体变量交给TIM_OC3Init，配置TIM4的输出比较通道4
	TIM_OC4Init(TIM4, & TIM_OCInitStructure); 
	
	/*TIM4使能*/
	TIM_Cmd(TIM4, ENABLE);
}


/**
  * 函    数：直流电机设置速度
  * 参    数：left, right要设置的速度，范围：0-1000
  * 返 回 值：无
  */
void Motor_SetSpeed(int left, int right)
{
	TIM_SetCompare4(TIM4, left);  //设置CCR4的值, 左边轮
	TIM_SetCompare3(TIM4, right);  //设置CCR3的值, 右边轮
}


/**
* 函    数：电机转动, 前进
  * 参    数：无
  * 返 回 值：无
  */
void Motor_Forward(void)
{
	/*设定轮子初始状态*/
	GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET); //Bit_RESET: 低电平 Bit_SET: 高电平 
	GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_SET);
	GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET);
	GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_SET);
	
	Motor_SetSpeed(BASE_SPEED, BASE_SPEED);
}

/**
* 函    数：电机转动, 后退
  * 参    数：无
  * 返 回 值：无
  */
void Motor_Back(void)
{
	/*设定轮子初始状态*/
	GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET); //Bit_RESET: 低电平 Bit_SET: 高电平 
	GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);
	GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);
	GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET);
	
	Motor_SetSpeed(BASE_SPEED, BASE_SPEED);
}


/**
  * 函    数：左转
  * 参    数：无
  * 返 回 值：无
  */
void Motor_GoLeft(void)
{
//	TIM_SetCompare3(TIM4, BASE_SPEED+0.5*DIFF_SPEED);  //设置CCR3的值, 右边轮
//	TIM_SetCompare4(TIM4, BASE_SPEED-DIFF_SPEED);  //设置CCR4的值, 左边轮
	
	Motor_SetSpeed(BASE_SPEED-DIFF_SPEED,BASE_SPEED+0.5*DIFF_SPEED); 
}

/**
  * 函    数：右转
  * 参    数：无
  * 返 回 值：无
  */
void Motor_GoRight(void)
{
//	TIM_SetCompare3(TIM4, BASE_SPEED-DIFF_SPEED);  //设置CCR3的值, 右边轮
//	TIM_SetCompare4(TIM4, BASE_SPEED+0.5*DIFF_SPEED);  //设置CCR4的值, 左边轮
	
	Motor_SetSpeed(BASE_SPEED+0.5*DIFF_SPEED, BASE_SPEED-DIFF_SPEED);
}


/**
  * 函    数：停止
  * 参    数：无
  * 返 回 值：无
  */
void Motor_Stop(void)
{
//	TIM_SetCompare3(TIM4, 0);  //设置CCR3的值, 右边轮
//	TIM_SetCompare4(TIM4, 0);  //设置CCR4的值, 左边轮
	
	Motor_SetSpeed(0,0);
}
